package com.mgq.java8.option;

import java.util.Optional;

/**
 * <b>功能：</b>OptionTest<br>
 * <b>Copyright mgq</b>
 * <li>版本&nbsp;&nbsp;&nbsp;&nbsp;修改日期&nbsp;&nbsp;&nbsp;&nbsp;部　　门&nbsp;&nbsp;&nbsp;&nbsp;作　者&nbsp;&nbsp;&nbsp;&nbsp;变更内容</li><hr>
 * <li>v1.0&nbsp;&nbsp;&nbsp;&nbsp;20220326&nbsp;&nbsp;营业后台&nbsp;&nbsp;&nbsp;&nbsp;马广奇&nbsp;&nbsp;&nbsp;&nbsp;创建类</li>
 * <br><br>
 *
 * @author 马广奇
 * @version 2022-03-26 21:50
 */
public class OptionTest {
    public static void main(String[] args) {
        //Optional的方法说明
        //1.isPresent()将在Optional包含值的时候返回true,否则返回false
        //2.ifPresent(Consumer<T> block)会在值存在的时候执行给定的代码块
        //3.get()会在值存在的时候返回值,否则抛出NoSuchElement异常
        //4.orElse()会在值存在时返回值,否则返回一个默认值
        Person person = new Person();
        System.out.println(testFlatMap(person));

    }

    /**
     * 创建Optional对象
     */
    public static void createOptional() {
        //1.声明一个空的Optional
        Optional<Car> optionalCar = Optional.empty();

        //2.根据一个非空值创建optional
        Car car = new Car();
        Optional<Car> optCar = Optional.of(car);

        //3.可接受null的optional
        Car car2 = new Car();
        Optional<Car> car3 = Optional.ofNullable(car2);

    }

    /**
     * 测试map()方法 使用map()方法从Optional对象中提取和转换值
     */
    public static void testMap() {
        //传统方法
        Insurance insurance = null;
        String name = null;
        if (insurance != null) {
            name = insurance.getName();
        }

        //使用optional (等价)
        Optional<String> nameOptional = Optional.ofNullable(insurance).map(Insurance::getName);
    }

    /**
     * 使用flatMap链接Optional对象
     */
    public static String testFlatMap(Person person) {
        //传统写法
        /*public String getCarInsuranceName(Person person) {
            return person.getCar().getInsurance().getName();
        }*/


        return  Optional.ofNullable(person).map(Person::getCar)
                .map(Car::getInsurance)
                .map(Insurance::getName)
                .orElse("unknown");
    }
}
